<?php
class User_permisos extends MY_Controller {

	public function __construct()
    {
    	# Al constructor le envío la clase Controlador, y el nombre de la entidad gestionada
    	parent::__construct(get_class($this), 'User_permiso');

    	$this->title = 'Usuarios :: Permisos';
		$this->CARPETA_VISTAS = 'usuarios/';
		$this->nombre_entidad = 'Permiso';

		$this->pagina_ver = $this->CARPETA_VISTAS . 'permiso_ver_todos_view';
		$this->pagina_editar = $this->CARPETA_VISTAS . 'permiso_edit_view';
		$this->pagina_filtros_ver = $this->CARPETA_VISTAS . 'permiso_filtros_ver_todos_view';

		$this->exportarExcelPermitido = FALSE;
	}

	/* IMPORTANTE: DEBE existir esta función. 
	 * Devuelve un arreglo que contiene el objeto de la entidad correspondiente, poblado con la información obtenida a 
	 * partir del formulario recibido a través de POST, y los objetos de otro tipo asociados al mismo.	*/
	protected function getObjetoDesdeForm()
	{
		$id_permiso = is_numeric($this->input->post('txt_id')) ? $this->input->post('txt_id') : NULL;
		$obj_permiso = $this->getObjeto($id_permiso);
		
		$datos['objEntidad'] = $obj_permiso;

		// Obtengo el Rol al que se le desean asociar los formularios
		$id_rol = is_numeric($this->input->post('sel_rol')) ? $this->input->post('sel_rol') : NULL;
		$datos['objRol'] = new User_rol($id_rol);

		$formularios = array();
		foreach ($this->input->post('sel_formulario') as $form) {
			$objForm = new User_formulario($form);
			$formularios[] = $objForm;
		}
		$datos['formularios'] = $formularios;

		$datos['objRelacionados'] = array();

		return $datos;
	}

	public function editar($id_rol = NULL)
	{
		// La edición de permisos se hace por ROL
		$dataView['objEntidad'] = $this->getObjeto();
		$dataView['id_rol'] = $id_rol;

		$this->_cargarFormEdicion($dataView);
	}


	/* IMPORTANTE: DEBE existir esta función. 
	 * Carga en el arreglo que luego se pasarán a las vistas, los datos correspondientes a otras entidades que se
	 * necesiten. Por ejemplo, en este método deben cargarse las entidades a las que puede asociarse o relacionarse
	 * la entidad actual. Si no se requiriesen, no se agrega nada. */
	protected function cargarDatosRelacionados($dataView)
	{
		$id_rol = isset($dataView['id_rol']) ? $dataView['id_rol'] : 0;

		// Creo un objeto del modelo, para poder buscar todos los datos en la BD
		$obj_rol = new User_rol($id_rol);

		$opcionesSel = array();
		if($id_rol != NULL && $id_rol != 0) {
			$dataView['listado_roles'] = $obj_rol;

			$obj_permiso = new User_permiso();
			$obj_permiso->where('user_rol_id', $id_rol);
			foreach ($obj_permiso->get_iterated() as $perm) {
				$opcionesSel[] = $perm->user_formulario_id;
			}
		}
		else $dataView['listado_roles'] = $obj_rol->get_iterated();
		$dataView['opcionesSel'] = $opcionesSel;

		// Utilizado para el filtrado
		$obj_menu = new User_menu();
		$dataView['listado_menues'] = $obj_menu->get_iterated();

		$obj_form = new User_formulario();
		$dataView['listado_formularios'] = $obj_form->get_iterated();

		return $dataView;
	}

	/* IMPORTANTE: DEBE existir esta función. 
	 * Obtiene el listado de elementos de acuerdo a los filtros que se hayan establecido y enviado a través
	 * del método POST. Devuelve un detalle de los filtros aplicados (o vacío si no hubiera filtros)	*/	
	protected function _aplicarFiltros($dataView = array())
	{
		// Creo un objeto del modelo, para poblarlo con los datos que necesito mostrar
		$objEntidad = $this->getObjeto();
		$detalle_filtros = '';

		$id_rol = trim($this->input->post('f_sel_rol'));
		if($id_rol != 0) { 
			$objEntidad->like('user_rol_id', $id_rol); 
			$detalle_filtros .= (!empty($detalle_filtros) ? ' | ' : '') . 'Rol ';
		}

		$id_menu = trim($this->input->post('f_sel_menu'));
		if($id_menu != 0) { 
			$objEntidad->where_related_user_formulario('user_menu_id', $id_menu); 
			$detalle_filtros .= (!empty($detalle_filtros) ? ' | ' : '') . 'Menú ';
		}

		$dataView['id_rol'] = $id_rol;
		$dataView['objEntidad'] = $objEntidad;
		$dataView['detalle_filtros'] = $detalle_filtros;

		return $dataView;
	}

	public function guardar()
	{
		$datos = $this->getObjetoDesdeForm();
		$objRol = $datos['objRol'];

		// Antes de crear los permisos, borro todos los que hubiera habido antes
		$objEntidad = $this->getObjeto();
		$objEntidad->where('user_rol_id', $objRol->id)->get();
		$error = parent::eliminarTodos($objEntidad);

		if(empty($error)) {
			$formularios = $datos['formularios'];
			foreach ($formularios as $form) {
				$dataView['objEntidad'] = $this->getObjeto();
				$dataView['objRelacionados'] = array($objRol, $form);
				
				$dataView = $this->guardarEntidad($dataView);
				if(!empty($dataView['error'])) $error .= $dataView['error'];
			}

			if(!empty($error)) {
				// Falló el intento de guardar
				$dataView['error'] = $error;
				$this->_cargarFormEdicion($dataView, TRUE); 
			}
			else { 
				// Utilizo el error únicamente para notificar algo
				$dataView['error'] = 'Los cambios realizados se verán reflejados en el próximo inicio de sesión.';
				$this->ver_todos(); 
			}
		}
		else {
			$dataView['error'] = 'Ocurrió un error al intentar eliminar los permisos iniciales.';
			$this->ver_todos($dataView);
		}
	}

	/* IMPORTANTE: DEBE existir esta función.
	 * Valida las condiciones que deben cumplirse para que un elemento pueda ELIMINARSE. */
	protected function validarEliminacion($id_elemento)
	{
		// No se permite la eliminación de usuarios
		return FALSE;
	}

	/* IMPORTANTE: DEBE existir esta función.
	 * Valida las condiciones que deben cumplirse para que un elemento pueda EDITARSE. */
	protected function validarEdicion($id_elemento)
	{
		$obj_usuario = $this->getObjeto($id_elemento);

		if(($obj_usuario->id != NULL && $obj_usuario->editable) || $obj_usuario->id == NULL) return TRUE;
		else return FALSE;
	}
}